package Shifu.MainServer.Management;

import java.rmi.RemoteException;
import Shifu.MainServer.Net.PeerServer;
import java.lang.Thread;
import java.lang.Object;
import java.io.Serializable;


/**
 * Scansiona periodicamente tutti i peers
 * per vedere quali sono ancora attivi
 */

public class Sonar extends Thread implements Serializable {

	/* campi */	

	private PeersRing ring;

	private Obreros obreros;
		
	/* costruttore */	
 
	/**
	 * Instanzia l'oggetto Sonar
	 * @param ring l'anello dei peers
	 * @param obreros obreros
	 */

	public Sonar(PeersRing ring,Obreros obreros) {
		this.ring = ring;
		this.obreros = obreros;
	}


	/* metodi */


	/**
	 * Imposta l'anello dei peers
	 * @param ring l'anello dei peers
	 */

	public void setPeersRing(PeersRing ring) {
		this.ring = ring;	
	}


	/**
	 * Imposta Ombreros
	 * @param obreros obreros 
	 */

	public void setObreros(Obreros obreros) {
		this.obreros = obreros;
	}


	/**
	 * Ritorna l'anello dei peers
	 * @return l'anello dei peers
	 */

	public PeersRing getPeersRing() {
		return this.ring;
	}

	/**
	 * Ritorna l'ombreros
	 * @return ombreros
	 */

	public Obreros getObreros() {
		return this.obreros;
	}


	/**
	 * Esegue uno scan sui peers dell'anello
	 */

	public void doScan() {

		int peerindex = 0;
		Peer currentpeer = null;

		System.out.println("Sonar: Inizio scansione peers !");		
		
		/* Fino a che non hai passato tutti i peers */					
		while(peerindex < ring.size() && ring.size() != 0) {
			
			currentpeer = (Peer) ring.getPeer(peerindex);
			PeerServer stub = currentpeer.getStub();

			System.out.println("Sonar: controllo se il peer: "+currentpeer.getId()+" è online");
	
			try {
				stub.areYouAlive();
			}catch (RemoteException e) {
				System.out.println("Sonar: Il peer: "+currentpeer.getId()+" non risponde, quindi verra rimosso! ");
				obreros.removePeer(currentpeer);
			}
			
			peerindex++;
		}
	}


	/**
	 * Il metodo eseguito una volta avviato il sonara
	 */

	public void run() {
		
		/* loop inf */
		while(true) {

			try {
				/*aspetta 1 minuto*/
				Thread.sleep(60000);

			} catch(InterruptedException ex) {
				System.out.println("Sonar: Errore nella sleep !!");
			}
			/*Chiama lo scan dei peers*/
			this.doScan();
		}	
	}
}
